/**
 * 统一支付工具类
 * 支持微信小程序、H5、App等平台的支付功能
 */

/**
 * 发起支付
 * @param {Object} result 后端返回的支付参数
 * @param {Object} self Vue实例
 * @param {Function} success 支付成功回调
 * @param {Function} fail 支付失败回调
 */
export function requestPayment(result, self, success, fail) {
  if (!result || !result.data) {
    uni.showToast({
      title: '支付参数错误',
      icon: 'none'
    });
    return;
  }

  // 显示加载中
  uni.showLoading({
    title: '发起支付中...',
    mask: true
  });

  // 根据不同平台调用不同的支付方式
  // #ifdef MP-WEIXIN
  wechatMiniProgramPay(result, self, success, fail);
  // #endif

  // #ifdef APP-PLUS
  if (result.data.pay_type === 20) {
    wechatAppPay(result, self, success, fail);
  } else {
    alipayAppPay(result, self, success, fail);
  }
  // #endif

  // #ifdef H5
  h5Payment(result, self, success, fail);
  // #endif
}

/**
 * 微信小程序支付
 */
function wechatMiniProgramPay(result, self, success, fail) {
  const payment = result.data.payment || {};
  
  uni.requestPayment({
    provider: 'wxpay',
    timeStamp: payment.timeStamp,
    nonceStr: payment.nonceStr,
    package: `prepay_id=${payment.package}`,
    signType: payment.signType,
    paySign: payment.paySign,
    success(res) {
      uni.hideLoading();
      success && success(res);
    },
    fail(err) {
      console.error('微信支付失败:', err);
      uni.hideLoading();
      if (err.errMsg === 'requestPayment:fail cancel') {
        uni.showToast({
          title: '您已取消支付',
          icon: 'none'
        });
      } else {
        uni.showToast({
          title: '支付失败，请重试',
          icon: 'none'
        });
      }
      fail && fail(err);
    }
  });
}

/**
 * 微信APP支付
 */
function wechatAppPay(result, self, success, fail) {
  plus.payment.getChannels(channels => {
    const channel = channels.find(c => c.id === 'wxpay');
    if (!channel) {
      uni.showToast({
        title: '未找到微信支付通道',
        icon: 'none'
      });
      return;
    }

    uni.requestPayment({
      provider: 'wxpay',
      orderInfo: result.data.payment,
      success(res) {
        uni.hideLoading();
        success && success(res);
      },
      fail(err) {
        handlePaymentError(err, fail);
      }
    });
  });
}

/**
 * 支付宝APP支付
 */
function alipayAppPay(result, self, success, fail) {
  uni.requestPayment({
    provider: 'alipay',
    orderInfo: result.data.payment,
    success(res) {
      uni.hideLoading();
      success && success(res);
    },
    fail(err) {
      handlePaymentError(err, fail);
    }
  });
}

/**
 * H5支付
 */
function h5Payment(result, self, success, fail) {
  // 根据返回的数据结构获取支付URL或表单
  const paymentData = result.data;
  
  // 处理支付宝H5支付
  if (paymentData.pay_type === '30') { // 30 表示支付宝支付
    // 创建表单并提交
    const form = document.createElement('form');
    form.method = 'POST';
    form.action = 'YOUR_ALIPAY_GATEWAY'; // 替换为实际的支付宝网关
    
    // 添加支付参数
    const params = {
      trusteeship_order_no: paymentData.trusteeship_order_no,
      total_amount: paymentData.total_amount,
      subject: '商品支付',
      body: '商品描述',
      // 添加其他必要的支付宝参数
    };
    
    // 添加隐藏的表单字段
    Object.keys(params).forEach(key => {
      const input = document.createElement('input');
      input.type = 'hidden';
      input.name = key;
      input.value = params[key];
      form.appendChild(input);
    });
    
    // 添加表单到页面并提交
    document.body.appendChild(form);
    form.submit();
    
    // 由于是页面跳转，这里不需要调用 success/fail
    uni.hideLoading();
    return;
  }
  
  // 其他支付方式处理
  const paymentUrl = paymentData.paymentUrl || (paymentData.payment && paymentData.payment.qr_code);
  
  if (paymentUrl) {
    // 跳转到支付页面或显示支付二维码
    uni.navigateTo({
      url: `/pages/payment/webview?url=${encodeURIComponent(paymentUrl)}`,
      success: () => {
        uni.hideLoading();
      },
      fail: (err) => {
        console.error('跳转支付页面失败:', err);
        uni.hideLoading();
        fail && fail(err);
      }
    });
  } else {
    uni.hideLoading();
    uni.showToast({
      title: '不支持的支付方式',
      icon: 'none'
    });
    fail && fail(new Error('Unsupported payment method'));
  }
}

/**
 * 统一处理支付错误
 */
function handlePaymentError(err, fail) {
  console.error('支付失败:', err);
  uni.hideLoading();
  
  let errMsg = '支付失败，请重试';
  
  if (err.errMsg) {
    if (err.errMsg.includes('cancel')) {
      errMsg = '您已取消支付';
    } else if (err.errMsg.includes('no service')) {
      errMsg = '未安装支付应用';
    }
  }
  
  uni.showToast({
    title: errMsg,
    icon: 'none'
  });
  
  fail && fail(err);
}

/**
 * 检查支付状态
 * @param {String} orderNo 订单号
 * @param {Function} callback 回调函数
 */
export function checkPaymentStatus(orderNo, callback) {
  if (!orderNo) {
    console.error('订单号不能为空');
    return;
  }
  
  // 这里调用你的后端API检查订单状态
  // uni.request({
  //   url: '/api/order/checkStatus',
  //   method: 'GET',
  //   data: { orderNo },
  //   success: (res) => {
  //     callback && callback(res.data);
  //   },
  //   fail: (err) => {
  //     console.error('检查支付状态失败:', err);
  //     callback && callback({ success: false, message: '检查支付状态失败' });
  //   }
  // });
}

export default {
  requestPayment,
  checkPaymentStatus
};
